package ar.pegasus.generador;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.xerces.jaxp.DocumentBuilderFactoryImpl;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import ar.pegasus.entidades.Foto;
import ar.pegasus.framework.util.DateUtil;

/** Clase abstracta para implementar un objeto Personal que se guarde en un archivo XML. */
public class GeneradorXML {

   // Etiquetas XML 
   private static final String TAG_RAIZ 		= "Fotos";
   private static final String TAG_FOTO 		= "Foto";
   private static final String TAG_NOMBRE_IMAGEN= "NombreArchivoImagen";
   private static final String TAG_COMENTARIO 	= "Comentario";
   private static final String TAG_NRO_FOTO		= "NroFoto";
   private static final String TAG_FECHA_FOTO	= "FechaFoto";
   
   //Codificación Estandar
   private static final String XML_VERSION 		    = "1.0";
   private static final String XML_ENCODING 		= "ISO-8859-1";
   private static final String JAVA_ENCODING 		= "8859_1";

   // Variables
   private Document 	xmlDoc 	= null;
   private Element 	raiz	= null;

  /** Método para retornar el documento XML en cadena de texto */ 
  public String obtenerTextoXML() {
      return generaTextoXML();
  }

   /** Método para generar el elemento Personal del documento XML usando DOM */ 
  public void generaDocumentoXML() {
    try {
      // Crea un documento XML
      DocumentBuilderFactory dbFactory = DocumentBuilderFactoryImpl.newInstance();
      DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();
      xmlDoc = docBuilder.newDocument();
    } catch(Exception e) {
        System.out.println("Error : " + e);
    }
    
    // crea un elemento personal
    raiz = xmlDoc.createElement(TAG_RAIZ);

    // agrega el elemento principal
    xmlDoc.appendChild(raiz);
  }

  /**
    * Método para generar documento XML usando DOM  
    * 
    * @param foto
   */
  public void generaDocumentoXMLEmpleado(Foto foto) {
    Element elementoFoto;
    Element item;

    elementoFoto = xmlDoc.createElement(TAG_FOTO);
    elementoFoto.setAttribute(TAG_NRO_FOTO, Integer.toString(foto.getNroFoto()));
    raiz.appendChild(elementoFoto);

    item = xmlDoc.createElement(TAG_NOMBRE_IMAGEN);
    item.appendChild(xmlDoc.createTextNode(foto.getFullPathArchivoImagen()));
    elementoFoto.appendChild(item);

    // epigrafe
    item = xmlDoc.createElement(TAG_COMENTARIO);
    item.appendChild(xmlDoc.createTextNode(foto.getEpigrafe()));
    elementoFoto.appendChild(item);

    //agrega el elemento Fecha de toma de la foto
    item = xmlDoc.createElement(TAG_FECHA_FOTO);
    item.appendChild(xmlDoc.createTextNode(DateUtil.dateToString(foto.getFechaCaptura(),DateUtil.SHORT_DATE_WITH_HOUR_SECONDS)));
    elementoFoto.appendChild(item);
  }

  // genera el objeto de documento XML en una cadena de texto
  private String generaTextoXML() {

    StringWriter  strWriter    = null;
    XMLSerializer xmlSerializer   = null;
    OutputFormat  outFormat    = null;

    try {
      xmlSerializer = new XMLSerializer();
      strWriter = new StringWriter();
      outFormat = new OutputFormat();

      // estableciendo el formato
      outFormat.setEncoding(XML_ENCODING);
      outFormat.setVersion(XML_VERSION);
      outFormat.setIndenting(true);
      outFormat.setIndent(4);
      
      // Define una escritura
      xmlSerializer.setOutputCharStream(strWriter);

      // Aplicando el formato establecido
      xmlSerializer.setOutputFormat(outFormat);

      // Serializando el documento XML
      xmlSerializer.serialize(xmlDoc);
      strWriter.close();
    } catch (IOException ioEx) {
        System.out.println("Error : " + ioEx);
    }
    return strWriter.toString();
  }
  
  public void grabaDocumentoXML(String nombreArchivo,String textoXML) {
      try {
         OutputStream fout= new FileOutputStream(nombreArchivo);
         OutputStream bout= new BufferedOutputStream(fout);
         OutputStreamWriter out = new OutputStreamWriter(bout, JAVA_ENCODING);
         out.write(textoXML);
         out.flush();
         out.close();
      } 
      catch (UnsupportedEncodingException e) {
        System.out.println("La M�quina Virtual no soporta la codificaci�n Latin-1.");
      }
      catch (IOException e) {
        System.out.println(e.getMessage());        
      }
      catch (Exception e) {
         System.out.println("Error : " + e);
      }
  }

  public static void main (String argv[]) {
//      GeneradorXML pXml = new GeneradorXML();
//      pXml.generaDocumentoXML();
//
//      ParsePosition position = new ParsePosition(0);
//      SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", Locale.UK);
//      
//      BeanEmpleado beanEmpleado = new BeanEmpleado();
//      
//      //Establecemos los valores de atributos de Empleado
//      beanEmpleado.setDNI("80114918");
//      beanEmpleado.setNombres("Jos� de la Rosa Ag�ero Montero");
//      beanEmpleado.setFecNac(formatter.parse("26-07-1985", position));
//      beanEmpleado.setSalario(new Float(1250.00));
//      
//      //Generamos documento XML para los valores anteriores
//      pXml.generaDocumentoXMLEmpleado(beanEmpleado);
//      
//      ParsePosition position1 = new ParsePosition(0);
//      
//      //Establecemos los valores de atributos de Empleado
//      beanEmpleado.setDNI("04025637");
//      beanEmpleado.setNombres("Juan Carlos Demarini Castellanos");
//      beanEmpleado.setFecNac(formatter.parse("03-08-1976", position1));
//      beanEmpleado.setSalario(new Float(1850.00));
//      
//      //Generamos nuevamente el documento XML para los valores anteriores
//      pXml.generaDocumentoXMLEmpleado(beanEmpleado);
//      
//      // obtenemos el documento XML en cadena de texto
//      String textoXML = pXml.obtenerTextoXML();
//      
//      // grabamos en archivo el documento XML
//      pXml.grabaDocumentoXML(textoXML);
//      
//      // mostramos en pantalla el documento XML grabado
//      System.out.println(textoXML);
  }
}